#include<bits/stdc++.h>
using namespace std;
long long t,n,m,l,mv,ans;
bool ap;
long long d[100500],v[100500],a[100500],p[100500],oans;
bool vis[100500];
struct node
{
	long long a=-1,b=-1;
	bool vis;
}anss[100500];
long double sq(long long fn)
{
	long double l=0,r=10000,mid;
	for(int i=1;i<=100;i++)
	{
		mid=(l+r)/(long double)2.00;
		if(mid*mid<fn)
			l=mid;
		else
			r=mid;
	}
	mid=(l+r)/(long double)2.00;
	return mid;
}
long long finds(long long a,long long b,long long c,long long l,long long r)
{
	long long ans=-1;
	long long mid=0;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if((p[mid]-a)*b*2+c*c>mv*mv)
		{
			ans=mid;
			l=mid+1;
		}
		else
			r=mid-1;
	}
	return ans;
}
bool check(long long i)
{
	if(v[i]<=mv)
		return false;
	else if(d[i]>=p[m])
		return false;
	anss[i].a=lower_bound(p+1,p+m+1,d[i])-p;
	anss[i].b=finds(d[i],a[i],v[i],anss[i].a,m);
	if(anss[i].b==-1ll)
		return false;
	return anss[i].b>=anss[i].a;
}
bool cmp(node a,node b)
{
	return a.a<b.a;
}
bool fun(long long a,long long b)
{
	for(int i=1;i<=m;i++)
		if(vis[i])
			if(a<=i&&i<=b)
				return true;
	return false;
}
void dfs(long long t,long long q,long long maxa)
{
	if(q>=ans)
		return;
	if(t==m)
	{
		long long ansss=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]>=0)
			{
				if(d[i]<=maxa&&(maxa-d[i])*a[i]*2+v[i]*v[i]>mv*mv)
					ansss++;
			}
			else
			{
				if(anss[i].vis)
					if(fun(anss[i].a,anss[i].b))
						ansss++;
			}
		}
		if(ansss==oans)
		{
			ans=q;
		}
		return;
	}
	vis[t+1]=true;
	dfs(t+1,q+1ll,p[t+1]);
	vis[t+1]=false;
	dfs(t+1,q,maxa);
}
int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld%lld%lld",&n,&m,&l,&mv);
		ap=true;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld%lld%lld",d+i,v+i,a+i);
			if(a[i]<0)
				ap=false;
		}
		for(int i=1;i<=m;i++)
			scanf("%lld",p+i);
		sort(p+1,p+m+1);
		if(ap)
		{
			long long ans=0;
			for(int i=1;i<=n;i++)
				if(d[i]<=p[m]&&(p[m]-d[i])*a[i]*2+v[i]*v[i]>mv*mv)
					ans++;
			printf("%lld %lld\n",ans,m-1);
		}
		else if(n<=20&&m<=20)
		{
			oans=0;
			for(int i=1;i<=n;i++)
			{
				if(a[i]>=0)
				{
					if(d[i]<=p[m]&&(p[m]-d[i])*a[i]*2+v[i]*v[i]>mv*mv)
					{
						oans++;
					}
				}
				else
				{
					anss[i].vis=check(i);
					if(anss[i].vis)
					{
						oans++;
					}
				}
			}
			printf("%lld ",oans);
			ans=0x3f3f3f3f;
			dfs(0,0,0);
			printf("%lld\n",n-ans);
		}
		else
		{
			long long ans=0;
			for(int i=1;i<=n;i++)
			{
				anss[i].vis=check(i);
				if(anss[i].vis)
					ans++;
			}
			printf("%lld ",ans);
			long long ro=0;
			ans=0;
			for(int i=1;i<=n;i++)
			{
				if(anss[i].vis)
				{
					if(anss[i].a>ro)
					{
						ro=anss[i].b;
						ans++;
					}
				}
			}
			printf("%lld\n",n-ans);
		}
	}
	return 0;
}
